iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
1
AI & Data

與資料庫共舞系列 第 16

Day 16 — MongoDB 導入資料、更新資料、刪除資料

  • 分享至 

  • xImage
  •  

跟之前一樣,今天我們來管理這個資料庫。首先讓我們建立資料庫。打開MongoSH

use contacts
show dbs

https://ithelp.ithome.com.tw/upload/images/20200916/20129829MkJBcIJEfk.png

我們直接使用一個叫做 contacts 的資料庫,如果這個資料庫並不存在現在的資料庫管理系統裡面,他就會創建新的。但是如果這個資料庫是空的,就會發現,當我打 show dbs 空空如也。

讓我們加入一個 叫做 people 的集合(collections) 和一筆資料:

db.people.insert({"name": "John"})

https://ithelp.ithome.com.tw/upload/images/20200916/20129829qBij0txjwB.png

你會發現插入資料之後這個資料庫就出現了,同時也會看到這個資料庫中有一個集合。MongoDB 就如同前面介紹 NoSQL 資料庫所講的,不同於SQL有嚴謹的架構和規則,你沒告訴MongoDB的,他一樣會想辦法幫你儲存,只要是沒看過的東西,都是先存再說。

Insert, InsertOne, InsertMany

MongoDB 總共有三種可以插入資料的方法。第一種使用的就是上面用的 insert ,他可以插入一筆或是多筆資料,所以也可以寫

db.people.insert([{"name": "Amy"}, {"name": "Alex"}, {"name": "Bob"}])

這時候三筆資料會分別放入資料庫。一般來說使用insert 後成功會回傳成功插入的資料個數,但是這裡使用的MongoSH 的行為比較像是 InsertOne 和 InsertMany。

db.people.insertMany([{"name": "Kevin"}, {"name": "Sean"}, {"name": "Cathy"}])

這時候他回傳的會是每一筆資料的 ObjectId 。在 MongoDB 中,預設的情況是每一個文件 (document) 系統都會給她一個獨一無二的數值來做辨識,系統使用的資料格式叫做 BSON (Binary JSON) 更有效率的儲存和歸檔這些資料。要特別注意的事情是,因問他不是一班的數字或是字串,所以在架接一些服務和系統時,務必要用BSON先做處理喔!

Schema?

也因為 MongoDB 如此自由,所以就很容易不小心讓同一個欄位存入不同資料型態的事件,有時候為了整理和未來資料處理方便,我們也會希望每一筆資料至少要有某些欄位。這時候就會借用 SQL 綱要的概念,去規範每筆要存入的資料,舉例來說,下面我們要建立一個新的資料集 store ,這時候我們就可以定義說我們一定要存入這間店的店名,同時要有這間店開店的年份。使用者可以自己決定要不要放入其他資料,但是最少一定要有這兩個項目。同時這邊也規定了,它們分別的格式和資料型態。當然這裡只有列舉幾個比較常見的指令,在MongoDB的官網上面有完整的資料!

db.createCollection("store", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "name", "start_year"],
         properties: {
            name: {
               bsonType: "string",
               description: "must be a string and is required"
            },
            start_year: {
               bsonType: "int",
               minimum: 1990,
               maximum: 2021,
               description: "must be an integer in [ 1990, 2021 ] and is required"
            }
         }
      }
   }
})

者時候如果插入不符合格式或是不完整的資料,系統就會阻止這筆資料加入資料庫,並顯示錯誤。

更新資料

如果我們想改動已經存在資料庫的資料,我們可以用 update ,這個指令的前段使用的是昨天我們討論查找 find 的塞選條件,後面我們可以 $set 設定這個找到的文件要更改的值。要特別注意的事情是,不管有幾項滿足這個查找的條件,update都只會找一個來更新。

db.people.update({ name: "Bob" }, {$set:{"happy":false}})

如果我們知道資料庫中有多筆符合條件的資料,又希望每一筆都被更新,就可以在最後加上 {multi: true} 。(或者可以使用 updateMany)

db.people.update({ name: { $regex: /^a.*/i } }, {$set:{"happy":true}}, {multi:true})

在 MongoDB 很多的指令可以做到的事情都只差在回傳值,例如在更新的時候,如果不是使用 update 而是 findOneAndUpdate 他回傳的就是更新完的整個文檔,而不是只有更新成功的資料。

另外,如果不想要址更新部分的資料,也可以用replace 直接把整個檔案給取代掉。

刪除

單筆的資料刪除一樣就是把塞選條件放進去

db.people.remove({ name:'Bob'})

如果要把整個collection 給清空 (沒錯就跟find一樣沒給條件就是全部喔!)

db.store.remove({})

要刪除整個Collection

db.store.drop()

刪除整個資料庫

db.dropDatabase()

工具

在 MongoDB Compass 的介面中,其實可以透過左側的側欄快速建構資料庫 (下面的按鈕) 和資料集合 (側邊的按鈕)。旁邊的垃圾桶可以刪除。

https://ithelp.ithome.com.tw/upload/images/20200916/20129829DWMVxadkHm.png

點選上面的 Add data 也可以手打或是匯入資料

https://ithelp.ithome.com.tw/upload/images/20200916/20129829w0ZTq01hY6.png

把每一筆資料展開也可以編輯資料本身的內容

https://ithelp.ithome.com.tw/upload/images/20200916/20129829kNnDMeVWLk.png

最後也可以透過右上角的 Validation 建立剛剛 Schema 的要求

https://ithelp.ithome.com.tw/upload/images/20200916/201298291qKs6eaLT3.png

這些工具都會適合拿來聊解並寫出正確的資料庫查詢語言。但是當回到系統整合,很多時候,還是得要寫出完整的程式碼阿!


上一篇
Day 15 — 一步一步寫出複雜的 MongoDB 指令
下一篇
Day 17 — MongoDB的關聯?
系列文
與資料庫共舞30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言